﻿/// <reference path="jquery-1.4.1-vsdoc.js">

/**
* jQuery Core Plugin 1.0
*
* Dispone de una serie de metodos destinados a la administracion de Mantenedores
* Entre ellos los necesarios para configurar y presentar la Grilla de Datos.
*
* Autor: Gabriel Ponce Bravo.
* Fecha: Abril 2011
*
* Dependencias : Date
* http://dean.edwards.name/packer/
*/
(function($) {

   $.addMantto = function(opciones) {
      //if (t.mto) return false; //return if already exist

      // Ponemos la variable de opciones antes de la iteración (each) para ahorrar recursos
      opciones = $.extend({
         ProcessId: 'divActividad'
						, ProcessId_: '#divActividad'
						, ProcessMessage: 'Procesando ...'
						, ProcessImage: '../images/activity.gif'
						, GridViewId: 'tblGridView'
						, GridViewId_: '#tblGridView'
						, ManttoPath: (window.location.href.indexOf('?') > 0 ? window.location.pathname : window.location.pathname + 'Default.aspx')
						, IsInit: false
      }, opciones);

      var mto = {
        IsView: function() {
          return (mto.GetUrlParam('View') != '' && mto.GetUrlParam('Id') == '' &&  mto.GetUrlParam('Action') == '');
        }
      , IsEdit: function() {
          return (mto.GetUrlParam('View') != '' && (mto.GetUrlParam('Id') != '' || mto.GetUrlParam('Action') != '') );
      }
			, Init: function() {
			   if (!opciones.IsInit) {
			      opciones.IsInit = true;
			      if (mto.IsView()) {
			         mto.ActionEdit();
			         mto.InitProgress();
			      } else if (mto.IsEdit()) {
			         mto.InitTab();
			      }
			   }
			}
			, InitTab: function(){
         //Preparar Caracteristicas para TAB, en las Ventanas de Agregar/Editar
         $("#divMaestro .tabContent").hide();
         $("#divMaestro .tabContent:first").show();
         $("#divMaestro .tabContent:first").find('input[type=text],textarea,select').filter(':enabled:first').focus();
         
         $("#divMaestro a.tab").click(function() {
            $("#divMaestro .active").removeClass("active");
            $(this).addClass("active");
            $("#divMaestro .tabContent").hide();
            var content_show = $(this).attr("title");
            $("#" + content_show).show();
         });
			}
			, InitValid: function() {
			   if (!mto.CheckLibrary(jQuery.fn.validate, 'Validate')) { return false; }
			   // Validar basada en Expresiones Regulares 
			   $.validator.addMethod('mask', function(value, element, parameters) {
			      if (this.optional(element)) { return true; }
			      //
			      var patt_ = new RegExp(parameters);
			      return patt_.test(value);
			   }, 'No cumple especificaci&oacute;n.');

			   // Validar un valor Decimal, espera los parametros lint y rint (enteros derecha e izquierda)
			   $.validator.addMethod('decimal', function(value, element, parameters) {
			      if (value.length == 0) { return true; }
			      //
			      var lint = typeof (parameters['lint']) == 'undefined' ? 0 : parseInt(parameters['lint']);
			      var rint = typeof (parameters['rint']) == 'undefined' ? 0 : parseInt(parameters['rint']);
			      if (lint == rint && lint == 0) { return false; }
			      //
			      var sPatt = '';
			      if (rint > 0) {
			         sPatt = '^[0-9]{1,' + lint + '}(,[0-9]{1,' + rint + '})?$';
			      } else {
			         sPatt = '^[0-9]{1,' + lint + '}$';
			      }
			      //
			      var patt_ = new RegExp(sPatt);
			      return patt_.test(value);
			   }, 'Se esperaba un decimal.');

			   // Validar un valor Fecha, de acuerdo al formato configurado Date.format
			   $.validator.addMethod('fecha', function(value, element) {
			      if (this.optional(element)) { return true; }
			      //
			      var patt_ = new RegExp(/^\d{1,2}\/\d{1,2}\/\d{4}$/);
			      if (patt_.test(value)) {
			         var fch_ = Date.fromString(value);
			         return fch_.asString() == value;
			      }
			      return false;
			   }, 'Se espera una Fecha.');

			}
			, InitProgress: function() {
			   var divAct = document.createElement('div');
			   var divBox = document.createElement('div');
			   var divPro = document.createElement('div');
			   var divCon = document.createElement('div');
			   var divHea = document.createElement('div');
			   var divBod = document.createElement('div');
			   var divImg = document.createElement('div');
			   //
			   divAct.id = opciones.ProcessId;
			   divAct.className = 'activity_overlay';
			   divAct.style.display = 'none';
			   //
			   divBox.className = 'activity_box';
			   divPro.className = 'activity_progress';
			   divCon.className = 'activity_container';
			   divHea.className = 'activity_header';
			   divBod.className = 'activity_body';
			   divImg.className = 'activity_img';
			   //
			   divHea.innerText = opciones.ProcessMessage;
			   //divBod.innerHTML = '<img alt="' + opciones.ProcessMessage + '" src="' + opciones.ProcessImage + '"/>';
			   divImg.innerHTML = '&nbsp;';
			   divBod.appendChild(divImg);
			   //
			   divCon.appendChild(divHea);
			   divCon.appendChild(divBod);

			   divPro.appendChild(divCon);
			   divBox.appendChild(divPro);
			   divAct.appendChild(divBox);
			   //
			   $('body').append(divAct);
			}
         /*
         * Metodo destinado a recuperar de la URL actual el Valor del Parametro indicado
         */
			, GetUrlParam: function(ParamName) {
			   var name = ParamName.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]');
			   var regexS = '[\\?&]' + name + '=([^&#]*)';
			   var regex = new RegExp(regexS);
			   var results = regex.exec(window.location.href);
			   if (results == null) {
			      return '';
			   } else {
			      return results[1];
			   }
			}
			, CheckLibrary: function(libType, libName) {
			   if (typeof (libType) == 'undefined') {
			      var sCad = 'No se encuentra definida la libreria: ' + (typeof (libName) == 'string' ? libName : libType.toString());
			      alert('Advertencia\r\n' + sCad);
			      return false;
			   }
			   return true;
			}
         /*
         * Metodo destinado a realizar las llamadas asinronas
         *
         * @url        : direccion url a solicitar
         * @parametros : parametro a enviar (objeto json) como string
         * @fxSucces   : funcion a ejecutar si la solicitud es exitosa
         * @fxError    : funcion a ejecutar si la solicitud presenta problemas
         */
			, RequestStart: function(url, parametros, btnCaller, fxSucces, fxError) {
			   //Validar que exista la libreria
			   if (!mto.CheckLibrary(JSON.stringify, "json2")) { return false; }
			   //
			   var sData = parametros;
			   if (typeof (parametros) == 'undefined') { return; }
			   if (typeof (parametros) != 'string') { sData = JSON.stringify(parametros); }

			   $.ajax({
			      type: 'POST',
			      url: url,
			      data: sData,
			      beforeSend: function(xhr) {
			         if (typeof (btnCaller) == 'object') { btnCaller.disable = true; }
			         mto.ActivityStart(); //Presentar dialogo de Actividad
			         xhr.setRequestHeader("Content-type", "application/json; charset=utf-8");
			      },
			      contentType: "application/json; charset=utf-8", //Set Content-Type
			      dataType: "json", // Set return Data Type
			      success: function(msg, status) {
			         if (typeof (btnCaller) == 'object') { btnCaller.disable = false; }
			         mto.ActivityStop(); //Detener dialogo de Actividad
			         if (typeof (fxSucces) == 'function') { fxSucces(msg, status); }
			      },
			      error: function(xhr, msg, e) {
			         if (typeof (btnCaller) == 'object') { btnCaller.disable = false; }
			         mto.ActivityStop(); //Detener dialogo de Actividad
			         //
			         if (typeof (fxError) == 'function') {
			            fxError(xhr, msg, e);
			         } else if (xhr.status == "200") {
			            var sErr = $("#divMessage", e).text();
			            //var divError = document.createElement('div');
			            //$(divError).html(e);
			            alert('Advertencia: \r\n' + sErr + '\r\nCorrija e intente nuevamente');
			         } else {
			            alert('Server Error: ' + xhr.status + ' , [' + xhr.statusText + ']');
			         }
			         return false;
			      }
			   });
			}
         /*
         * Metodo encargado de presentar la animacion de Actividad
         *
         * NT: Es necesario definir la siguiente seccion HTML
         *   <div id="divActividad"  style="display:none;margin-left: 10px;">
         *     <div class="activity_progress">
         *      <div class="activity_container">
         *        <div class="activity_header">Procesando ...</div>
         *        <div class="activity_body"><img src="<% Response.Write(ResolveUrl("~/Assets/images/activity.gif")); %>" /></div>
         *      </div>
         *     </div> 
         *   </div>     
         */
			, ActivityStart: function() {
			   $(opciones.ProcessId_).show();
			   return true;
			}
         /*
         * Metodo encargado de detener la animacion de Actividad
         */
			, ActivityStop: function() {
			   $(opciones.ProcessId_).hide();
			   return true;
			}
			, GrillaSearch: function(oEntity, btnCaller) {
			   if (typeof (oEntity) != 'object') { return; }
			   if (typeof (oEntity.Item) != 'function') { return; }
			   //
			   $(opciones.GridViewId_).flexSearch(oEntity.Item());
			}
         /*
         * Metodo encargado de configurar la Grilla Indicada
         */
			, GrillaConfig: function(oEntity) {
			   if (typeof (oEntity.IdentityName) != 'string' || !mto.IsView()) { return; }
			   //Validar que exista la libreria
			   if (!mto.CheckLibrary(jQuery.fn.flexigrid, "FlexiGrid")) { return false; }
			   if (!mto.IsInit) { mto.Init(); }
			   //
			   var sName = oEntity.IdentityName;
			   var width = $(opciones.GridViewId_).parent().width(); // - 17;
			   var oCol = oEntity.Columns;
			   //
			   $(opciones.GridViewId_).flexigrid({
			      url: opciones.ManttoPath + '?View=' + oEntity.IdentityName
					, dataType: 'json'
					, colModel: oCol
					, usepager: true
					, title: oEntity.IdentityName
					, useRp: true
					, rp: 10
					, showTableToggleBtn: false
					, showToggleBtn: false
					, width: width
					, height: 220
					, singleSelect: true
					, resizable: false
					, pagestat: 'Registros, {from} a {to} de un total de {total}'
					, striped: false
					, nomsg: 'Sin Informaci&oacute;n'
			      //Despues de Obtener los datos y antes de procesarlos
			      //Parsear los datos recuperados de acuerdo a lo esperado x la grilla
					, preProcess: function(data) {
					   if (data.Rows == null) return data;
					   //
					   var oRows = data.Rows;
					   var oArr = new Array(oRows.length);
					   //Modelo de Columnas utilizadas
					   //Para cada una de la columnas, analizar sus relaciones y reemplazar el Id x Descripcion
					   for (i = 0; i < oCol.length; i++) {
					      if (oCol[i].relation != null) {
					         //Buscar el DropDownList con la informacion
					         cbo = $(':input[id$="ctl' + oCol[i].name + '"]');
					         if (cbo.length > 0) {
					            for (x = 0; x < oRows.length; x++) {
					               for (idx = 0; idx < cbo[0].options.length; idx++) {
					                  if (oRows[x][oCol[i].name] == cbo[0].options[idx].value) {
					                     oRows[x][oCol[i].name] = cbo[0].options[idx].text;
					                     break;
					                  }
					               }
					            }
					         }
					      }
					   }

					   //Parsear la informacion de acuerdo al modelo de datos procesable
					   for (x = 0; x < oRows.length; x++) {
					      var oVal = new Array();
					      //Modelo de Columnas utilizadas
					      for (i = 0; i < oCol.length; i++) {
					         oVal[i] = oRows[x][oCol[i].name];
					         if (oCol[i].name == 'Id') {
					            var cod = oVal[i];
					            oVal[i] = '<a href="' + opciones.ManttoPath + '?View=' + oEntity.IdentityName
										  + '&Id=' + cod
										  + '&TB_iframe=true" class="jqBox" title="Editar informaci&oacute;n ..." >Editar</a>';
										  
								if (oEntity.IdentityName == "Conciliacion")
								{		  
									oVal[i] = oVal[i] + '&nbsp;<a href="' + opciones.ManttoPath + '?View=' + oEntity.IdentityName
										  + '&Id=' + cod
										  + '&Rpt=' + (oEntity.IdentityName == "Conciliacion" ? "S":"N") + ' " title="Informe Conciliaci&oacute;n" >Informe</a>';
							    }
					         } else if ((typeof (oVal[i]) == "string") && (oVal[i].indexOf("/Date") >= 0)) {
					            valor = new Date(parseInt(oVal[i].slice(6, 19)));
					            if (typeof (valor) != 'undefined') {
					               oVal[i] = valor.asString();
					            }
					         }
					      }
					      oArr[x] = {
					         id: oRows[x]['Id']
								, cell: oVal
					      };
					   }
					   //
					   data.Rows = oArr;
					   return data;
					}
					, onSuccess: function() {
					   mto.ActivityStop();
					   mto.ActionEdit();
					}
					, onError: mto.ActivityStop
			      //Antes de solicitar la informacion
					, onSubmit: mto.ActivityStart
			   });

			}
         /*
         * Metodo destinado a configurar para cada fila el PopUpDialog 
         */
			, ActionEdit: function() {
			   $("a.jqBox").unbind("click");
			   $("a.jqBox").click(function() {
			      var t = this.title || this.name || null;
			      var a = this.href || this.alt;
			      var g = this.rel || false;

			      jqBox.tb_show(t, a, g);
			      this.blur();
			      return false;
			   });
			}
			, ActionEditStart: function() {
			   jqBox.tb_showIframe();
			   //$(".tabContentModal:first").find('input[type=text],textarea,select').filter(':enabled:first').focus();
			}
			, ActionEditClose: function(message) {   			
			   try {
			      top.$.Mantto.jqBox.tb_remove();
			      if (typeof (message) == "string") {
			         top.$('[id$="lblMessage"]').html(message);
			      }
			      top.$(opciones.GridViewId_).flexReload();
			   } catch (ex) { }			   
			}
      };


      var jqBox = {
         loadStart: mto.ActivityStart
			, loadStop: mto.ActivityStop
			, tb_show: function(caption, url, imageGroup) {//function called when the user clicks on a thickbox link
			   try {
			      if (typeof (document.body.style.maxHeight) == "undefined") {//if IE 6
			         $("body", "html").css({ height: "100%", width: "100%" });
			         $("html").css("overflow", "hidden");
			         if (document.getElementById("TB_HideSelect") === null) {//iframe to hide select elements in ie6
			            $("body").append("<iframe id='TB_HideSelect'></iframe><div id='TB_overlay'></div><div id='TB_window'></div>");
			         }
			      } else {//all others
			         if (document.getElementById("TB_overlay") === null) {
			            $("body").append("<div id='TB_overlay'></div><div id='TB_window'></div>");
			         }
			      }

			      if (jqBox.tb_detectMacXFF()) {
			         $("#TB_overlay").addClass("TB_overlayMacFFBGHack"); //use png overlay so hide flash
			      } else {
			         $("#TB_overlay").addClass("TB_overlayBG"); //use background and opacity
			      }

			      if (caption === null) { caption = ""; }
			      //$("body").append("<div id='TB_load'><img src='"+imgLoader.src+"' /></div>");//add loader to the page
			      jqBox.loadStart(); //$('#TB_load').show();//show loader

			      var baseURL = "";
			      if (url.indexOf("?") !== -1) { //ff there is a query string involved
			         baseURL = url.substr(0, url.indexOf("?"));
			      } else {
			         baseURL = url;
			      }

			      var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
			      var urlType = baseURL.toLowerCase().match(urlString);

			      var queryString = url.replace(/^[^\?]+\??/, '');
			      var params = jqBox.tb_parseQuery(queryString);

			      TB_WIDTH = (params['width'] * 1) + 30 || $("#TB_window").width(); //defaults to 630 if no paramaters were added to URL
			      TB_HEIGHT = (params['height'] * 1) + 40 || $("#TB_window").height(); //defaults to 440 if no paramaters were added to URL
			      ajaxContentW = TB_WIDTH - 30;
			      ajaxContentH = TB_HEIGHT - 45;

			      if (url.indexOf('TB_iframe') != -1) { // either iframe or ajax window		
			         urlNoQuery = url.split('TB_');
			         $("#TB_iframeContent").remove();
			         if (params['modal'] != "true") { //iframe no modal
			            $("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>" + caption
								+ "</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='Cerrar'>Cerrar</a>"
								+ "</div></div><iframe frameborder='0' hspace='0' src='" + urlNoQuery[0]
								+ "' id='TB_iframeContent' name='TB_iframeContent" + Math.round(Math.random() * 1000)
								+ "' onload='$.Mantto.ActionEditStart()' style='width:" + (ajaxContentW + 29) + "px;height:"
								+ (ajaxContentH + 17) + "px;' > </iframe>");
			         } else { //iframe modal
			            $("#TB_overlay").unbind();
			            $("#TB_window").append("<iframe frameborder='0' hspace='0' src='" + urlNoQuery[0]
								+ "' id='TB_iframeContent' name='TB_iframeContent" + Math.round(Math.random() * 1000)
								+ "' onload='$.Mantto.ActionEditStart()' style='width:" + (ajaxContentW + 29) + "px;height:"
								+ (ajaxContentH + 17) + "px;'> </iframe>");
			         }
			      }

			      $("#TB_closeWindowButton").click(jqBox.tb_remove);

			      if (url.indexOf('TB_iframe') != -1) {
			         jqBox.tb_position();
			         if ($.browser.safari) { //safari needs help because it will not fire iframe onload
			            $("#TB_window").css({ display: "block" });
			         }
			      }

			      if (!params['modal']) {
			         document.onkeyup = function(e) {
			            if (e == null) { // ie
			               keycode = event.keyCode;
			            } else { // mozilla
			               keycode = e.which;
			            }
			            if (keycode == 27) { // close
			               jqBox.tb_remove();
			            }
			         };
			      }

			   } catch (e) {
			      var sOut = "Problemas al procesar el formulario solicitado!";
			      if (typeof (e.message) != "undefined") { sOut += "\r\n" + e.message; }
			      alert(sOut);
			   }
			}

         //helper functions below
			, tb_showIframe: function() {
			   jqBox.loadStop(); //$("#TB_load").remove();
			   $("#TB_window").css({ display: "block" });
			   var container_ = $('#TB_window iframe');
			   if ( container_.length > 0 ) {
			      var frameDocument = container_[0].contentDocument || container_[0].contentWindow.document;
			      //$(frameDocument).find('input[type=radio][checked]');
			      $(".tabContentModal:first", frameDocument).find('input[type=text],textarea,select').filter(':enabled:first').focus();
			   }
			}

			, tb_remove: function() {
			   $("#TB_imageOff").unbind("click");
			   $("#TB_closeWindowButton").unbind("click");
			   $("#TB_window").fadeOut("fast", function() { $('#TB_window,#TB_overlay,#TB_HideSelect').trigger("unload").unbind().remove(); });
			   if ($("#TB_window").length > 0) jqBox.loadStop(); //$("#TB_load").remove();
			   if (typeof (document.body.style.maxHeight) == "undefined") {//if IE 6
			      $("body", "html").css({ height: "auto", width: "auto" });
			      $("html").css("overflow", "");
			   }
			   document.onkeydown = "";
			   document.onkeyup = "";
			   $(".tabContent:first").find('input[type=text],textarea,select').filter(':enabled:first').focus();
			   return false;
			}

			, tb_position: function() {
			   $("#TB_window").css({ marginLeft: '-' + parseInt((TB_WIDTH / 2), 10) + 'px', width: TB_WIDTH + 'px' });
			   if (!(jQuery.browser.msie && jQuery.browser.version < 7)) { // take away IE6
			      $("#TB_window").css({ marginTop: '-' + parseInt((TB_HEIGHT / 2), 10) + 'px' });
			   }
			}

			, tb_parseQuery: function(query) {
			   var Params = {};
			   if (!query) { return Params; } // return empty object

			   Pairs = query.split(/[;&]/);
			   for (var i = 0; i < Pairs.length; i++) {
			      KeyVal = Pairs[i].split('=');
			      if (!KeyVal || KeyVal.length != 2) { continue; }
			      key = unescape(KeyVal[0]);
			      val = unescape(KeyVal[1]);
			      val = val.replace(/\+/g, ' ');
			      Params[key] = val;
			   }
			   return Params;
			}

			, tb_getPageSize: function() {
			   de = document.documentElement;
			   w = window.innerWidth || self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
			   h = window.innerHeight || self.innerHeight || (de && de.clientHeight) || document.body.clientHeight;
			   arrayPageSize = [w, h];
			   return arrayPageSize;
			}

			, tb_detectMacXFF: function() {
			   var userAgent = navigator.userAgent.toLowerCase();
			   if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox') != -1) {
			      return true;
			   }
			}
      };
      //make grid functions accessible
      var res = mto;
      res.jqBox = jqBox;
      res.opciones = opciones;
      return res;
   };

   //Funcion Publica
   $.Mantto = null;

   // constructor for validator
   $.mantto = function(opciones_user) {
      if ($.Mantto == null) {
         $.Mantto = $.addMantto(opciones_user);
         $.Mantto.Init();
      }
      return $.Mantto;
   };

   //Funcion Publica
   $(document).ready(function() {
      if ($.Mantto == null) {
         $.Mantto = new $.mantto();
      }
   });

   //   $.fn.mantto = function(opciones_user) {
   //      return this.each(function() {
   //         return mantto_instance;
   //      });
   //   }; //end Mantto

})(jQuery);